import java.util.*;

public class listeSuivant {
	ArrayList<ArrayList<ArrayList<Integer>>> suivant;

	public listeSuivant(jeuDeNotes jeu) {
		suivant = genererListeSuivant(jeu);
	}

	ArrayList<ArrayList<ArrayList<Integer>>> genererListeSuivant(jeuDeNotes jeu) {
		ArrayList<ArrayList<ArrayList<Integer>>> suivant = new ArrayList<ArrayList<ArrayList<Integer>>>(
				jeu.jeuDeNotes.size());

		for (int i = 0; i < jeu.jeuDeNotes.size() - 1; i++) { // parcourt
																// l'instant
																// i de la
																// mélodie
			ArrayList<ArrayList<Integer>> listeJeuDeNotes = new ArrayList<ArrayList<Integer>>();
			suivant.add(listeJeuDeNotes);
			for (int j = 0; j < jeu.jeuDeNotes.get(i).size(); j++) { // parcourt
																		// le
																		// jeu
																		// de
																		// notes
																		// possible
																		// d'indice
																		// j
				ArrayList<Integer> listeJeuxPossibles = new ArrayList<Integer>();
				suivant.get(i).add(listeJeuxPossibles);
				for (int k = 0; k < jeu.jeuDeNotes.get(i + 1).size(); k++) { // parcourt
																				// le
																				// jeu
																				// de
																				// notes
																				// possible
																				// suivant,
																				// d'indice
																				// k
					if (ReglesEnchainement.estVerifiee(jeu.jeuDeNotes.get(i)
							.get(j), jeu.jeuDeNotes.get(i + 1).get(k))) { // vérifie
																			// si
																			// les
						// 2 jeux de
						// notes
						// s'enchainent
						listeJeuxPossibles.add(k);
						// l'indice k du jeu de note est alors ajouté
					}
				}
			}
		}
		return suivant;

	}

	public void nettoyerSuivant() {
		for (int i = suivant.size() - 2; i != 0; i--) {
			for (int j = 0; j < suivant.get(i).size(); j++) {
				for (int k = 0; k < suivant.get(i).get(j).size(); k++) {
					if (!aUnSuivant(i, j, k)) {
						suivant.get(i).get(j).remove(k);
					}
				}
			}
		}
	}

	boolean aUnSuivant(int i, int j, int k) {
		if (suivant.get(i + 1).get(suivant.get(i).get(j).get(k)).isEmpty()) {
			return false;
		}
		return true;
	}

	public int[] genererHarmo() {
		int[] harmo = new int[suivant.size()];
		int aux;
		if ((suivant.get(0).size() == 0) || (suivant.get(0).get(0).size() == 0)) {
			aux = 0;
		} else {
			aux = suivant.get(0).get(0).get(0);
		}
		harmo[0] = aux;

		for (int i = 1; i < suivant.size(); i++) {
			if ((suivant.get(i).size() == 0)
					|| (suivant.get(i).get(aux).size() == 0)) {
				harmo[i] = harmo[i - 1];
			} else {
				aux = suivant.get(i).get(aux).get(0);
				harmo[i] = aux;
			}
		}
		return harmo;
	}

}
